package hl.crazy_java.chapter_18.reflect;

import hl.crazy_java.chapter_18.Person;

import java.lang.reflect.Field;
import java.util.Arrays;

/**
 * 
 * @author Liu Huan
 */


public class demoField {
	/**
	 1、获取成员变量们
		 Field getField(String name)
		 Field[] getFields()
		 Field getDeclaredField(String name)
		 Field[] getDeclaredFields()
	 2、获取成员方法们
		 Method getMethod(String name, Class<?>... parameterTypes)
		 Method[] getMethods()
		 Method getDeclaredMethod(String name, Class<?>... parameterTypes)
		 Method[] getDeclaredMethods()
		 Method getEnclosingMethod()
	 3、获取构造器们
		 Constructor<T>getConstructor(Class<?>... parameterTypes)	
		 Constructor<?>[]getConstructors()
		 Constructor<T>getDeclaredConstructor(Class<?>... parameterTypes)
		 Constructor<?>[]getDeclaredConstructors()
		 Constructor<?>getEnclosingConstructor()
	 4、获取类名，包名
		 String getName()
		 String getPackageName()
	 */
	public static void main(String[] args) throws Exception {
		
		//获取 Class 对象
		Class<Person> personClass = Person.class;
		
		//获取 任一权限的 所有成员变量 并打印
		Field[] declaredFields = personClass.getDeclaredFields();
		for (Field declaredField : declaredFields) {
			System.out.println(declaredField);
		}
		
		// 获取/设置 pp对象中的 name 成员变量的值
		// 如果成员变量为 private 修饰，需要
		Field name = personClass.getDeclaredField("name");
		Person pp = new Person("hello",23,"wang",12.3);
		name.setAccessible(true);
		System.out.println(name.get(pp));
		name.set(pp,"liu");
		System.out.println(name.get(pp));
		
		
		//获取 public修饰的 所有成员变量 并打印
		Field[] fields = personClass.getFields();
		for (Field field : fields) {
			System.out.println(field);
		}
		
		//获取 public修饰的 bb成员变量
		Field bb = personClass.getField("bb");
		// 获取/设置 pp对象中的 bb 成员变量的值
		System.out.println(bb.get(pp));
		bb.set(pp,66.6);
		System.out.println(bb.get(pp));
	}
}
